/*
 * Copyright 2018 The JA-SIG Collaborative. All rights reserved.
 * distributed with thi file and available online at
 */
package com.lap.codegen.utils;

import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Objects;

/**
 * @author 劳水生
 * @version 1.0.0
 */
public final class FileUtils {
    private FileUtils() {
    }

    /**
     * <p>
     * 字符串转换成 后缀是.java的字符串，如: Person 转换成 Person.java
     * </p>
     *
     * @param prefix 在文件加上前缀
     * @param name   真实名字
     * @param suffix 后缀
     * @return
     */
    public static String getJavaFileName(String prefix, String name, String suffix) {
        StringBuilder sb = new StringBuilder();

        if (StringUtils.isNotBlank(name)) {
            if (StringUtils.isNotBlank(prefix)) {
                sb.append(prefix);
            }
            sb.append(CodeUtils.getUpper(name));
            if (StringUtils.isNotBlank(suffix)) {
                sb.append(suffix);
            }
            sb.append(Constants.JAVA);
        }
        return sb.toString();
    }

    /**
     * Mapper.xml 文件
     *
     * @param name   文件名
     * @param suffix 后缀
     * @return
     */
    public static String getMapperName(String name, String suffix) {
        StringBuilder sb = new StringBuilder();
        if (StringUtils.isNotBlank(name)) {
            sb.append(CodeUtils.getUpper(name));

            if (StringUtils.isNotBlank(suffix)) {
                sb.append(suffix);
            }

            sb.append(Constants.XML);
        }
        return sb.toString();
    }

    /**
     * <p>
     * 字符串转换成 后缀是.java的字符串，如: Person 转换成 Person.java
     * </p>
     *
     * @param name   名字
     * @param suffix 后缀
     * @return
     */
    public static String getJavaFileName(String name, String suffix) {
        return FileUtils.getJavaFileName(null, name, suffix);
    }

    /**
     * 根据项目路径名称+包名，生成文件路径地址
     *
     * @param packName 包名
     * @param suffix   扩展名
     * @return
     */
    public static String getJavaPath(String project, String packName, String suffix) {
        return FileUtils.getFilePath(project, "src/main/java", packName, suffix);
    }

    /**
     * <pre>
     *  获取跟目录
     * </pre>
     *
     * @param project
     * @return
     */
    public static String getRootPath(String project) {
        return FileUtils.getFilePath(project, null, null, null);
    }

    /**
     * 资源
     *
     * @param project 项目名
     * @return
     */
    public static String getResources(String project) {
        return FileUtils.getResources(project, null);
    }

    /**
     * 根据项目路径名称+包名，生成文件路径地址
     *
     * @param project  项目名
     * @param packName 包名
     * @return
     */
    public static String getResources(String project, String packName) {
        return FileUtils.getFilePath(project, "src/main/resources", packName, null);
    }

    /**
     * 根据项目路径名称+包名，生成文件路径地址
     *
     * @param project  项目名
     * @param packName 包名
     * @param suffix   扩展名
     * @return
     */
    public static String getTestPath(String project, String packName, String suffix) {
        return FileUtils.getFilePath(project, "src/test/java", packName, suffix);
    }

    /**
     * 统一处理文件
     *
     * @param project  项目名
     * @param prefix   前缀
     * @param packName 报名
     * @param suffix   后缀
     * @return
     */
    private static String getFilePath(String project, String prefix, String packName, String suffix) {
        StringBuilder sb = new StringBuilder();
        if (StringUtils.isNotBlank(project)) {
            sb.append(project);
            if (!project.endsWith(".")) {
                sb.append(".");
            }
        }
        if (StringUtils.isNotBlank(prefix)) {
            sb.append(prefix);
            if (!prefix.endsWith(".")) {
                sb.append(".");
            }
        }
        if (StringUtils.isNotBlank(packName)) {
            sb.append(packName);
            if (!packName.endsWith(".")) {
                sb.append(".");
            }
        }
        if (StringUtils.isNotBlank(suffix)) {
            sb.append(suffix);
            if (!suffix.endsWith(".")) {
                sb.append(".");
            }
        }
        return sb.toString().replace(".", "/");
    }

    /**
     * <pre>
     * 获取当前运行项目的路径，如：
     * 1、在bin下运行时候/codegen/test/bin
     * 2、在ide情况下/codegen/test
     * 3、由于不同环境，可能项目名不存在，那么需要判断项目名是否存在
     * </pre>
     *
     * @return
     */
    public static String getCurPath() {
        String path = System.getProperty("user.dir");
        if (Objects.nonNull(path)) {
            if (path.indexOf(Constants.PROJECT_NAME) < 0) {
                path = path.replace("\\", "/") + "/" + Constants.PROJECT_NAME;
            } else {
                path = path.replace("\\", "/");
            }
        }
        return path;
    }

    /**
     * <pre>
     * 获取运行路径:
     *  1、如果存在bin，说明是项目打包好运行的，需要对bin进行过滤，才能获取目录路径 。
     *  2、否则是ide运行，直接返回目录就是当前路径。
     * </pre>
     *
     * @return 路径
     */
    public static String getRunPath() {
        String curPath = FileUtils.getCurPath();
        if (curPath.indexOf("bin") != -1) {
            return curPath.substring(0, curPath.indexOf("bin"));
        } else {
            return curPath + "/src/main/resources";
        }
    }

    /**
     * 获取文件内容的MD5
     *
     * @param file
     * @return
     */
    public static String getFileMd5(File file) {
        try (InputStream fis = new FileInputStream(file);) {
            MessageDigest mMessageDigest = MessageDigest.getInstance("MD5");

            byte[] buffer = new byte[1024];
            int length = -1;
            while ((length = fis.read(buffer, 0, 1024)) > 0) {
                mMessageDigest.update(buffer, 0, length);
            }
            return new BigInteger(1, mMessageDigest.digest()).toString(16);
        } catch (IOException | NoSuchAlgorithmException e) {
        }
        return null;
    }

    /**
     * sha1比较文件内容是否相同
     *
     * @param file
     * @return
     */
    public static String getFileSha1(File file) {
        if (!file.isFile()) {
            return null;
        }
        MessageDigest digest = null;
        byte[] buffer = new byte[8192];
        int len;
        try (FileInputStream in = new FileInputStream(file);) {
            digest = MessageDigest.getInstance("SHA-1");

            while ((len = in.read(buffer)) != -1) {
                digest.update(buffer, 0, len);
            }
            BigInteger bigInt = new BigInteger(1, digest.digest());
            return bigInt.toString(16);
        } catch (Exception e) {
        }
        return null;
    }

    /**
     * 校验文件是否重复
     *
     * @param content
     * @return
     */
    public static String getStringSha1(String content) {
        MessageDigest digest = null;
        try {
            digest = MessageDigest.getInstance("SHA-1");
            digest.update(content.getBytes());
            BigInteger bigInt = new BigInteger(1, digest.digest());
            return bigInt.toString(16);
        } catch (NoSuchAlgorithmException e) {
        }
        return null;
    }

    /**
     * 对内容进行MD5
     *
     * @param content
     * @return
     */
    public static String getStringMd5(String content) {
        MessageDigest mMessageDigest = null;
        try {
            mMessageDigest = MessageDigest.getInstance("MD5");
            mMessageDigest.update(content.getBytes());
            return new BigInteger(1, mMessageDigest.digest()).toString(16);
        } catch (NoSuchAlgorithmException e) {
            return null;
        }
    }

}
